package conservare.modelo.financeiro;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.DiscriminatorColumn;
import javax.persistence.DiscriminatorType;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import conservare.listener.AuditoriaListener;
import conservare.modelo.Auditoria;
import conservare.modelo.type.TipoBaixaContaPaga;

@Entity
@Table(name="tb_conta_paga")
@EntityListeners(AuditoriaListener.class)
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="DISCRIMINATOR_COLUMN", discriminatorType = DiscriminatorType.STRING)
@DiscriminatorValue("TIPO_DESCONHECIDO")
public abstract class Pagamento implements Serializable{

	private static final long serialVersionUID = -6403635421007088309L;

	public static enum FORMA_PAGAMENTO{VIA_DINHEIRO, VIA_BOLETO;}
	
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name="pagamento_id")
	private Integer id;
	
	@Column(name="dt_pagam")
	@Temporal(TemporalType.DATE)
	private Date dataDePagamento;
	
	
	@Column(name="vlr_pago")
	private BigDecimal valorPago = new BigDecimal(0.0);
	
	@Enumerated(EnumType.STRING)
	@Column(name="tipo_baixa")
	private TipoBaixaContaPaga tipoBaixa;
	
	/*@ManyToOne(targetEntity=ContaAReceber.class)
	@JoinColumn(name="conta_arec_id")
	private ContaAReceber contaAReceber;*/
	
	
	
	@Embedded
	private Auditoria auditoria;

	
	/*public void adicionarContaAReceber(ContaAReceber contaAReceber){
		this.contaAReceber = contaAReceber;
	}*/
	
	public abstract String getDescricao();
	
	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public Date getDataDePagamento() {
		return dataDePagamento;
	}

	public void setDataDePagamento(Date dataDePagamento) {
		this.dataDePagamento = dataDePagamento;
	}

	public BigDecimal getValorPago() {
		return valorPago;
	}

	public void setValorPago(BigDecimal valorPago) {
		if(valorPago == null){
			this.valorPago = BigDecimal.ZERO;
		}else{
			this.valorPago = valorPago;
		}
	}

	public TipoBaixaContaPaga getTipoBaixa() {
		return tipoBaixa;
	}

	public void setTipoBaixa(TipoBaixaContaPaga tipoBaixa) {
		this.tipoBaixa = tipoBaixa;
	}

/*	public ContaAReceber getContaAReceber() {
		return contaAReceber;
	}*/

	/*public void setContaAReceber(ContaAReceber contaAReceber) {
		this.contaAReceber = contaAReceber;
	}*/

	public Auditoria getAuditoria() {
		return auditoria;
	}

	public void setAuditoria(Auditoria auditoria) {
		this.auditoria = auditoria;
	}
	
	
	
}
